package br.com.velp.sudecap.datamodel;

import br.com.velp.sudecap.dto.ParametrosComunsDTO;
import br.com.velp.sudecap.entidade.Formato;
import br.com.velp.sudecap.service.FormatoService;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.hibernate.criterion.Order;
import org.primefaces.model.LazyDataModel;
import org.primefaces.model.SortOrder;

/**
 * <sumario>
 * <objetivo> "Rastreabilidade" </objetivo>
 * <autor> EDUARDO SANTOS DE OLIVEIRA </autor>
 * <versao> 1.0.0.0 </versao>
 * <data_criacao> 18.12.2013 </data_criacao>
 * <data_ultima_alteracao> N/A </data_ultima_alteracao>
 * <requisito_afetado> N/A </requisito_afetado>
 * <descricao> Data Model Para Pesquisa de Formatos Por Demanda </descricao>
 * </sumario>
 */
public class FormatoDataModel extends LazyDataModel<Formato> implements Serializable {
    
    public static final Long serialVersionUID = 1l;

    private List<Formato> formatos;
    private FormatoService formatoService;
    private ParametrosComunsDTO parametros;
    private boolean configurarPaginaInicial;

    public FormatoDataModel(FormatoService formatoService, ParametrosComunsDTO parametros) {
	
        this.formatoService = formatoService;
	this.formatos = new ArrayList<Formato>();
	this.parametros = parametros;
        this.configurarPaginaInicial = true;
        
        setPageSize(0);
        
    }

    @Override
    public List<Formato> load(int firstResult, int maxResults, String campoOrdenacao, SortOrder sortOrder, Map<String, String> filters) {

	Order order = null;

	if (sortOrder != null && campoOrdenacao != null) {
	    if (sortOrder.equals(SortOrder.ASCENDING)) {
		order = Order.asc(campoOrdenacao);
	    } else if (sortOrder.equals(SortOrder.DESCENDING)) {
		order = Order.desc(campoOrdenacao);
	    }
	}
        
        if(this.configurarPaginaInicial){
            firstResult = 0;
        }

	setRowCount(this.formatoService.contarFormatos(this.parametros));
        
        if(getRowCount() > 0){
            this.formatos = this.formatoService.buscarFormatosPaginados(firstResult, maxResults, this.parametros, order);
        }
        
        this.configurarPaginaInicial = false;
	
	return this.formatos;

    }

    @Override
    public Object getRowKey(Formato formato) {
	return formato.getId();
    }

    @Override
    public Formato getRowData(String idFormato) {
	Long id = Long.valueOf(idFormato);
	for (Formato formato : this.formatos) {
	    if (id.equals(formato.getId())) {
		return formato;
	    }
	}
	return null;
    }

}
